/**
 * <strong>生成器是一种创建型设计模式，使你能够分步骤创建复杂对象。<br>
 * 与其他创建型模式不同，生成器不要求产品拥有通用接口。这使得用相同的创建过程生成不同的产品成为可能。<br>
 * <br>
 * 在 Java 中使用模式</strong><br>
 * 使用示例：生成器模式是 Java 世界中的一个著名模式。当你需要创建一个可能有许多配置选项的对象时，该模式会特别有用。<br>
 * 生成器在 Java 核心程序库中得到了广泛的应用：<br>
 * {@link java.lang.StringBuilder#append(java.lang.String)}（非同步）<br>
 * {@link java.lang.StringBuffer#append(java.lang.String)}（同步）<br>
 * {@link java.nio.ByteBuffer#put(byte)}（还有 <code>Char­Buffer、 Short­Buffer、 Int­Buffer、 Long­Buffer、 Float­Buffer 和 Double­Buffer</code>）<br>
 * {@link javax.swing.GroupLayout.Group#addComponent(java.awt.Component)}<br>
 * {@link java.lang.Appendable} 的所有实现<br>
 * 识别方法：生成器模式可以通过类来识别，它拥有一个构建方法和多个配置结果对象的方法。生成器方法通常支持方法链（例如 someBuilder->setValueA(1)->setValueB(2)->create()）。<br>
 * <br>
 * <strong>分步制造汽车</strong><br>
 * 在本例中，生成器模式允许你分步骤地制造不同型号的汽车。<br>
 * 示例还展示了生成器如何使用相同的生产过程制造不同类型的产品 （汽车手册）。<br>
 * 主管控制着构造顺序。它知道制造各种汽车型号需要调用的生产步骤。它仅与汽车的通用接口进行交互。这样就能将不同类型的生成器传递给主管了。<br>
 * 最终结果将从生成器对象中获得，因为主管不知道最终产品的类型。只有生成器对象知道自己生成的产品是什么。<br>
 * <br>
 * <strong>生成器模式适合应用场景</strong><br>
 * 场景：<br>
 * 使用生成器模式可避免“重叠构造函数（telescopic constructor）”的出现。<br>
 * 解决：<br>
 * 假设你的构造函数中有十个可选参数，那么调用该函数会非常不方便；因此，你需要重载这个构造函数，新建几个只有较少参数的简化版。但这些构造函数仍需调用主构造函数，传递一些默认数值来替代省略掉的参数。<br>
 * 生成器模式让你可以分步骤生成对象，而且允许你仅使用必须的步骤。应用该模式后，你再也不需要将几十个参数塞进构造函数里了。<br>
 * <br>
 * 场景：<br>
 * 当你希望使用代码创建不同形式的产品时，可使用生成器模式。<br>
 * 解决：<br>
 * 如果你需要创建的各种形式的产品，它们的制造过程相似且仅有细节上的差异，此时可使用生成器模式。<br>
 * 基本生成器接口中定义了所有可能的制造步骤，具体生成器将实现这些步骤来制造特定形式的产品。同时，主管类将负责管理制造步骤的顺序。<br>
 * <br>
 * 场景：<br>
 * 使用生成器构造组合树或其他复杂对象。<br>
 * 解决：<br>
 * 生成器模式让你能分步骤构造产品。你可以延迟执行某些步骤而不会影响最终产品。你甚至可以递归调用这些步骤，这在创建对象树时非常方便。<br>
 * 生成器在执行制造步骤时，不能对外发布未完成的产品。这可以避免客户端代码获取到不完整结果对象的情况。<br>
 * <br>
 * <strong>实现方法</strong>
 * <ol>
 *     <li>清晰地定义通用步骤，确保它们可以制造所有形式的产品。否则你将无法进一步实施该模式。</li>
 *     <li>在基本生成器接口中声明这些步骤。</li>
 *     <li>为每个形式的产品创建具体生成器类，并实现其构造步骤。<br>
 *     不要忘记实现获取构造结果对象的方法。你不能在生成器接口中声明该方法，因为不同生成器构造的产品可能没有公共接口，因此你就不知道该方法返回的对象类型。但是，如果所有产品都位于单一类层次中，你就可以安全地在基本接口中添加获取生成对象的方法。</li>
 *     <li>考虑创建主管类。它可以使用同一生成器对象来封装多种构造产品的方式。</li>
 *     <li>客户端代码会同时创建生成器和主管对象。构造开始前，客户端必须将生成器对象传递给主管对象。通常情况下，客户端只需调用主管类构造函数一次即可。主管类使用生成器对象完成后续所有制造任务。还有另一种方式，那就是客户端可以将生成器对象直接传递给主管类的制造方法。</li>
 *     <li>只有在所有产品都遵循相同接口的情况下，构造结果可以直接通过主管类获取。否则，客户端应当通过生成器获取构造结果。</li>
 * </ol>
 * <br>
 * <strong>生成器模式优缺点</strong><br>
 * 优点：
 * <ul>
 *     <li>你可以分步创建对象，暂缓创建步骤或递归运行创建步骤。</li>
 *     <li>生成不同形式的产品时，你可以复用相同的制造代码。</li>
 *     <li>单一职责原则。你可以将复杂构造代码从产品的业务逻辑中分离出来。</li>
 * </ul>
 * 缺点：
 * <ul>
 *     <li>由于该模式需要新增多个类， 因此代码整体复杂程度会有所增加。</li>
 * </ul>
 * <br>
 * <strong>与其他模式的关系</strong>
 * <ul>
 *     <li>在许多设计工作的初期都会使用工厂方法模式（较为简单，而且可以更方便地通过子类进行定制），随后演化为使用抽象工厂模式、原型模式或生成器模式（更灵活但更加复杂）。</li>
 *     <li>生成器重点关注如何分步生成复杂对象。抽象工厂专门用于生产一系列相关对象。抽象工厂会马上返回产品，生成器则允许你在获取产品前执行一些额外构造步骤。</li>
 *     <li>你可以在创建复杂组合模式树时使用生成器，因为这可使其构造步骤以递归的方式运行。</li>
 *     <li>你可以结合使用生成器和桥接模式：主管类负责抽象工作，各种不同的生成器负责实现工作。</li>
 *     <li>抽象工厂、生成器和原型都可以用单例模式来实现。</li>
 * </ul>
 */
package com.cg.design.depthdesign.builder;